package cn.antia.db;

import cn.antia.cep.db.DBException;

import java.util.List;
import java.util.Map;
import java.sql.Connection;

/**
 * User: Jaccob Xiao
 * Date: 2008-6-27
 * Time: 16:59:20
 */
public interface GenericDAO {
    /**
     * 取数据库连接，具体从哪得到数据库连接由具体的DAO实现
     * 注意：此方法为最基础的方法，必须实现
     * @return DB Connection
     */
    public Connection getDBConnection();
    /***
     * 查询语句，返回JavaBean
     * JavaBean的属性只支持基本的JDBC SQL类型
     * @param <T> <T>
     * @param sql sql
     * @param clazz 返回的对象类型
     * @return  List<T>
     */
    public <T> List<T> queryList(String sql,Class<T> clazz);

     /**
     * 查询，返回一个对象，对象由参数clazz决定
     * @param  sql:JdbcSql
     * @param clazz Class
     * @return List<T>
     */
    public <T> List<T> queryList(JdbcSql sql,Class<T> clazz);

    /**
     * 查询，指定页与页大小
     * @param sql 原始SQL
     * @param page 页码
     * @param pageSize 页大小
     * @param orderField 排序字段
     * @param isAsc 是否升序
     * @param clazz 返回的对象名称
     * @return List<T>
     */
    public <T> List<T> queryList(String sql,int page,int pageSize,String orderField,boolean isAsc,Class<T> clazz);

    /**
     * 查询，指定页与页大小
     * @param sql 原始SQL
     * @param page 页码
     * @param pageSize 页大小
     * @param orderField 排序字段
     * @param isAsc 是否升序
     * @param clazz 返回的对象名称
     * @return List<T>
     */
    public <T> List<T> queryList(JdbcSql sql,int page,int pageSize,String orderField,boolean isAsc,Class<T> clazz);

    /**
     * 查询这条SQL语句的记录总数
     * @param sql sql
     * @return 记录总数
     */
    public int getRecordCount(String sql);

    /**
     * 查询这条SQL语句的记录总数
     * @param sql JdbcSql
     * @return 记录总数
     */
    public int getRecordCount(JdbcSql sql);

    /**
     * 返回第一列与第二列的MAP，以第一列为KEY，第二列为VALUE
     * @param sql sql,查询字段必须为2个或以上，否则将返回为空的MAP
     * @return Map<K, T>
     */
    public <K,T> Map<K, T> queryMap(String sql);

    /**
     * 返回第一列与第二列的MAP，以第一列为KEY，第二列为VALUE
     * @param sql JdbcSql,查询字段必须为2个或以上，否则将返回为空的MAP
     * @return Map<K, T>
     */
    public <K,T> Map<K, T> queryMap(JdbcSql sql);

    /**
     * 执行查询单列结果的SQL，泛型的类型可以是Java - JDBC 映射的类型(如Date,String,Integer,Long......)
     * @param sql       sql
     * @return          list<T>
     */
    public <T> List<T> queryFirstField(String sql);

    /**
     * 执行查询单列结果的SQL，泛型的类型可以是Java - JDBC 映射的类型(如Date,String,Integer,Long......)
     * @param sql       sql
     * @return          list<T>
     */
    public <T> List<T> queryFirstField(JdbcSql sql);

    /**
     * 根据SQL,返回查询结果,List<Map<field,value>>
     * @param sql:SQL语句
     * @return list:(表信息列表，一条信息用一个Map代表)
     */
    public List<Map<String,Object>> queryListMap(String sql);

    /**
     * 查询，指定页与页大小
     * @param sql 原始SQL
     * @param page 页码
     * @param pageSize 页大小
     * @param orderField 排序字段
     * @param isAsc 是否升序
     * @return List<T>
     */
    public List<Map<String,Object>> queryListMap(String sql,int page,int pageSize,String orderField,boolean isAsc);

    /**
     * 根据SQL,返回查询结果,List<Map<field,value>>
     * @param sql:SQL语句
     * @return list:(表信息列表，一条信息用一个Map代表)
     */
    public List<Map<String,Object>> queryListMap(JdbcSql sql);

    /**
     * 查询，指定页与页大小
     * @param sql 原始SQL
     * @param page 页码
     * @param pageSize 页大小
     * @param orderField 排序字段
     * @param isAsc 是否升序
     * @return List<T>
     */
    public List<Map<String,Object>> queryListMap(JdbcSql sql,int page,int pageSize,String orderField,boolean isAsc);

    /**
     * 根据SQL,返回第一行查询结果,Map<field,value>
     *
     * @param sql:SQL语句
     * @return Map<field,value>:(表信息列表)
     */
    public Map<String,Object> queryFirstMap(String sql);
    /**
     * 根据SQL,返回第一行查询结果,Map<field,value>
     *
     * @param sql:SQL语句
     * @return Map<field,value>:(表信息列表)
     */
    public Map<String,Object> queryFirstMap(JdbcSql sql);

    /**
     * 查询第一个值 一般用于 select name from User where ID = 1 之类的情况
     * @param sql sql
     * @return <T>
     */
    public <T> T queryFirstObject(String sql);

    /**
     * 查询第一个值 一般用于 select name from User where ID = 1 之类的情况
     * @param sql sql
     * @return <T>
     */
    public <T> T queryFirstObject(JdbcSql sql);
    /**
	 * 更新
	 * @param sql	SQL
	 * @return	更新行数
	 * @throws cn.antia.cep.db.DBException
	 */
	public int update(String sql);
    /**
	 * 更新
	 * @param sql	SQL
	 * @return	更新行数
	 * @throws cn.antia.cep.db.DBException
	 */
	public int update(JdbcSql sql);
}
